package com.hua.designpattern.creational.prototype;

/**
 * @author joshua
 * 
 *         <pre>
 * 
 * 用原型实例指定创建对象的种类，并且通过拷贝这些原型创建新的对象。
 * 
 * 优点
 * 1、Prototype模式允许对象在不了解要创建对象的确切类以及如何创建等细节的情况下创建自定义对象。
 * 2、是一种高效创类的方式。可以不受构造函数的约束。
 * 
 * 缺点
 * 1、实现clone的方式需要实现java.lang.Cloneable接口或者实现java.io.Serializable来完成浅拷贝或者深拷贝。
 * 
 *   REF:
 *      Bean Scope=prototype
 * 
 * 
 *         </pre>
 *
 */
public class TestPrototype {

	public static void main(String[] args) {
		CloneThin cloneThin = new CloneThin();
		CloneThin cloneObject1 = cloneThin.clone();
		cloneObject1.setId(100);
		cloneObject1.setAge(200);
		cloneObject1.setName("300");
		cloneObject1.getPerson().setId(10);
		cloneObject1.getPerson().setAge(20);
		cloneObject1.getPerson().setName("30");
		System.out.println(cloneThin);
		System.out.println(cloneObject1);

		CloneDeep cloneDeep = new CloneDeep();
		CloneDeep cloneObject2 = cloneDeep.clone();
		cloneObject2.setId(100);
		cloneObject2.setAge(200);
		cloneObject2.setName("300");
		cloneObject2.getPerson().setId(10);
		cloneObject2.getPerson().setAge(20);
		cloneObject2.getPerson().setName("30");
		System.out.println(cloneDeep);
		System.out.println(cloneObject2);

		CloneByIO cloneByIO = new CloneByIO();
		CloneByIO cloneObject3 = cloneByIO.deepClone();
		cloneObject3.setId(100);
		cloneObject3.setAge(200);
		cloneObject3.setName("300");
		cloneObject3.getPerson().setId(10);
		cloneObject3.getPerson().setAge(20);
		cloneObject3.getPerson().setName("30");
		System.out.println(cloneByIO);
		System.out.println(cloneObject3);

	}

}
